//安全帽模块
const { ethers, upgrades } = require('hardhat')

// const { ethers, run, network } = require('hardhat')

async function main() {
  const EUROCash = await ethers.getContractFactory('EUROCash')

  // 部署合约, 并调用初始化方法
  const myEUROCash = await upgrades.deployProxy(
    EUROCash,
    [
      'cfxtest:aakn4cg4nuf77s41p6414mwcmh2s92n9a2x31eyj9a', //owner -- gnosis safe 多签账户
      'cfxtest:aak2d89k9tsmrnzjj6wmtbuhu29trjjvx6uzw6wnf7', //operator
      'cfxtest:aarpncc5f4s3fxrr4vf4s4ye253t18tc825p0dg9u0', //guardian -- gnosis safe 多签账户
    ],
    {
      initializer: 'initialize',
      kind: 'uups',
    },
  )

  await myEUROCash.waitForDeployment()

  // 代理合约地址
  const proxyAddress = myEUROCash.target
  // 实现合约地址
  const implementationAddress = await upgrades.erc1967.getImplementationAddress(
    proxyAddress,
  )
  // proxyAdmin 合约地址
  const adminAddress = await upgrades.erc1967.getAdminAddress(proxyAddress)

  console.log(`EUROCash ProxyAddress: ${proxyAddress}`)
  console.log(`EUROCash ImplementationAddress: ${implementationAddress}`)
  // Warning: A proxy admin was previously deployed on this network
  //  // 管理员合约实际不存在了，只有代理合约和实现合约
  console.log(`EUROCash AdminAddress: ${adminAddress}`)

  // // 合约验证
  // if (network.config.chainId === 4 && process.env.ETHERSCAN_API_KEY) {
  //   await myEUROCash.deployTransaction.wait(6)
  //   await verify(proxyAddress, [])
  // }
}

// // 这个方法我们调用了 hardhat 包中的 run 方法，并且传递了一个 verify 命令，并且传递了一个参数 { address: contractAddress, constructorArguements: args }。
// // 因为可能我们的合约已经在 Etherscan 上验证过，所以我们做了一个 try...catch... 错误处理，如果验证过，则会抛出一个错误，并且输出一个提示信息，而不影响我们的部署流程。
// async function verify(contractAddress, args) {
//   console.log('Verifying EUROCash Contract...')
//   try {
//     await run('verify:verify', {
//       address: contractAddress,
//       constructorArguements: args,
//     })
//   } catch (e) {
//     if (e.message.toLowerCase().includes('already verified!')) {
//       console.log('Already Verified!')
//     } else {
//       console.log(e)
//     }
//   }
// }

main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error)
    process.exit(1)
  })
